/*
题目描述
用函数分别实现下列的功能：
(1)     输入10个职工的姓名和职工号；
(2)     按照职工号由小到大的顺序排序，注意需要随之调整姓名顺序；
(3)     输入一个职工号，用折半查找法找出该职工的姓名，要求通过主函数输入要查找的职工号，同时从主函数输出该职工的姓名。
输入
共有11行。
前10行中的每一行包含了一个职工的姓名和职工号。姓名是一个不包含空格且长度不超过20的字符串，职工号是一个不小于0且不大于1000的整数。
最后一行包含一个职工号，表示需要查找姓名的职工。保证需要查找的职工号一定出现在已经输入的10个职工信息中。
输出
共有11行。
前10行每一行输出按照职工号从小到大排序后的职工信息，包括姓名和职工号，用一个空格隔开。
最后一行输出查找到的职工姓名。
请注意行尾输出换行。
*/
#include <stdio.h>
#include <string.h>
void sort(char names[10][21], int *ids)
{
    for (int i = 0; i < 10; i++)
    {
        for (int j = i + 1; j < 10; j++)
        {
            if (*(ids + i) > *(ids + j))
            {
                int tid = *(ids + i);
                *(ids + i) = *(ids + j);
                *(ids + j) = tid;
                char tname[21];
                strcpy(tname, names[i]);
                strcpy(names[i], names[j]);
                strcpy(names[j], tname);
            }
        }
    }
}

void printData(char names[10][21], int ids[10])
{
    for (int i = 0; i < 10; i++)
    {
        printf("%s %d\n", names[i], ids[i]);
    }
}

void printNameById(char names[10][21], int ids[10], int target)
{
    int begin = 0;
    int end = 9;
    int index = (begin + end) / 2;
    while (target != ids[index])
    {
        if (target < ids[index])
        {
            end = index;
            index = (begin + end) / 2;
        }
        else if (target > ids[index])
        {
            begin = index;
            index = (begin + end) / 2;
        }
    }
    printf("%s",names[index]);
}

int main()
{
    char names[10][21];
    int ids[10];
    int target;
    for (int i = 0; i < 10; i++)
    {
        scanf("%s %d", &names[i], &ids[i]);
    }
    scanf("%d", &target);
    sort(names, ids);
    printData(names, ids);
    printNameById(names,ids,target);
}